<?php
/**
 * Переводы
 * 
 * Класс для работы с локилизацией языков
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Класс для работы с локилизацией языков
 *
 */
class T{
	/**
	 * Без отлова ошибок
	 *
	 */
	const NO_DEBUG=0;
	/**
	 * логируем ошибки, сохраняем пропущенные переводы и дубликаты
	 *
	 */
	const LOG_DEBUG=1;
	/**
	 * логируем и помечаем ошибки, сохраняем пропущенные переводы и дубликаты
	 * пропущеные зачёркиваются, дубликаты выделены **
	 *
	 */
	const SHOW_DEBUG=2;
	/**
	 * Массив переводов
	 *
	 * @var unknown_type
	 */
	private static $lang=array();
	/**
	 * Список пропущенных слов
	 *
	 * @var unknown_type
	 */
	public static $lost=array();
	/**
	 * Список дубликатов
	 *
	 * @var unknown_type
	 */
	public static $double=array();
	/**
	 * Режим дебага
	 *
	 * @var unknown_type
	 */
	public static $debug_mode=self::NO_DEBUG;
	/**
	 * Текущий язык
	 *
	 * @var unknown_type
	 */
	public static $locale;
	/**
	 * Перевод строки
	 *
	 * @param string $name имя переменной
	 * @param array $args аргументы для sprintf функции
	 * @return string
	 */
	public static function _($name,$args=null){
		$name=strtoupper($name);
		//если не находим неревод
		if(!isset(self::$lang[$name])){
			//записываем как пропущенный при дебаге
			if(self::$debug_mode)self::$lost[$name]=true;
			//помечаем при дебаге
			if(self::$debug_mode==self::SHOW_DEBUG)$name='<strike>'.$name.'</strike>';
			return $name;
		}
		//если нет аргументов то возвращаем как есть
		if($args===null){
			return self::$lang[$name];
		}else{
			//еначе обрабатываем функцией sprintf
			$args=array_reverse($args);
			//вставляем первым аргументом строку
			$args[]=self::$lang[$name];
			$args=array_reverse($args);
			return call_user_func_array('sprintf',$args);
		}
	}
	/**
	 * загружаем перевод
	 *
	 * @param string $name имя модуля (в папке lang/[язык]) должен лежать таакой файл с расширением ini
	 * @return boolean
	 */
	public static function load($name){
		//проверяем текущую локаль иначе берём по умолчанию
		if(!self::$locale)self::$locale=Config::_('default_lang');
		$file=Config::_('path_lang').FS.self::$locale.FS.$name.'.ini';
		//проверяем существование языкового файла
		if(!File::exists($file)){
			//устанавливаем сбой языкового файла
			new CoreExeption("Не найден языковый файл ".$file,E_WARNING,__FILE__,__LINE__,array('name'=>$name));
			return false;
		}
		$ini=parse_ini_file(Config::_('path_file').FS.$file, false);
		L('Загружен языковой файл '.$file);
		//проходим по массиву
		foreach ($ini as $key=>$item) {
			//сохраняем всё в верхнем регистре
			$key=strtoupper($key);
			//при дубликате и дебаге логируем
			if(self::$debug_mode){
				if(isset(self::$lang[$key])){
					//записываем как дубликат
					if(!isset(self::$double[$name]))self::$double[$name]=array();
					self::$double[$name][$key]=array(self::$lang[$key],$item);
					//при дебаге помечаем что это дубликат
					if(self::$debug_mode==self::SHOW_DEBUG)$item='*'.$item.'*';
				}
			}
			self::$lang[$key]=$item;
		}
		return true;
	}
	/**
	 * Создаём файл с пропущеннвми словами
	 *
	 * @param string $name имя файла с пропущенными словами (если не указан то не запишет а вернёт строку)
	 * @return mixed массив или true\false
	 */
	public static function buildLostTranslate($name='lost'){
		//если нет потеряшек то выходим
		if(!count(self::$lost))return true;
		//проверяем текущую локаль иначе берём по умолчанию
		if(!self::$locale)self::$locale=Config::_('default_lang');
		$file=Config::_('path_lang').FS.self::$locale.FS.$name.'.ini';
		$ini=parse_ini_file($file, false);
		$list=array();
		foreach (self::$lost as $key=>$value) {
			if(isset($ini[$key]))continue;
			$list[]=$key.' = '.$key;
		}
		//если нет имени то возвращаем результат
		if(!$name)return $list;
		$l='';
		foreach ($list as $item)$l.=$item.'
';
		//инaче дописываем в файл
		return File::_($file,$l,array('mode'=>File::APPEND,'add'=>true));
	}
}